/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.trandio.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.naming.NamingException;
import org.trandio.model.CitaVO;
import org.trandio.model.TurnoDetVO;
import org.trandio.model.TurnoVO;
import org.trandio.util.ConexionDb;

/**
 *
 * @author Administrador
 */
public class CitaDAO implements CitaInterface {

    @Override
    public List<TurnoDetVO> consultarDetalleTurno(int id_medico, String fecha_turno, int id_sede) throws SQLException, NamingException {

        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        String condicion = "";

        List<TurnoDetVO> listDetTurnoVO = new ArrayList<TurnoDetVO>();

        String sql = " SELECT tb_turnomedico.fecha,"
                + "tb_detalleturno.hora_inicio,"
                + "tb_detalleturno.hora_final,"
                + "tb_detalleturno.id,"
                + "tb_turnomedico.tiempo,"
                + "tb_citamedica.estado,"
                + "tb_paciente.nombre1,"
                + "tb_paciente.nombre2,"
                + "tb_paciente.apellido1,"
                + "tb_paciente.apellido2 "
                + "FROM tb_detalleturno "
                + "INNER JOIN tb_turnomedico ON (tb_detalleturno.id_turnomedico = tb_turnomedico.id) "
                + "LEFT JOIN tb_citamedica   ON (tb_detalleturno.id = tb_citamedica.id_detalleturno) "
                + "LEFT JOIN tb_paciente     ON (tb_citamedica.id_paciente = tb_paciente.id)"
                + " WHERE "
                + " tb_turnomedico.id_medico = " +id_medico 
                + " AND tb_detalleturno.fecha_turno ='"+fecha_turno+"' "                
                + " AND tb_turnomedico.id_sede = " +id_sede    
                + " AND tb_detalleturno.estado ='F' " 
                + " AND (reasignada ='F' OR reasignada is null)"
                + " AND (tb_detalleturno.fecha_turno+tb_detalleturno.hora_inicio) > CURRENT_TIMESTAMP";

        System.out.println("Sql BUSCAR detalle turnos: " + sql);

        PreparedStatement stmt = conn.prepareStatement(sql);
        try {
            ResultSet res = stmt.executeQuery();
            try {
                while (res.next()) {
                    TurnoDetVO turnoDetVO = new TurnoDetVO();
                    String ampm = "";
                    int hi = 0;
                    int hf = 0;
                    String strHini = "";
                    String strHfin = "";

                    turnoDetVO.setId(res.getInt("id"));
                    String[] hinicio = res.getString("hora_inicio").split(":");
                    if (Integer.parseInt(hinicio[0]) >= 12) {
                        ampm = "PM";
                        hi = Integer.parseInt(hinicio[0]) - 12;
                    } else {
                        ampm = "AM";
                        hi = Integer.parseInt(hinicio[0]);
                    }

                    strHini = hi + ":" + hinicio[1];
                    //turnoDetVO.setHinicio(res.getString("hora_inicio")+" "+ampm);
                    turnoDetVO.setHinicio(strHini + " " + ampm);


                    String[] hfin = res.getString("hora_final").split(":");
                    if (Integer.parseInt(hfin[0]) >= 12) {
                        ampm = "PM";
                        hf = Integer.parseInt(hfin[0]) - 12;
                    } else {
                        ampm = "AM";
                        hf = Integer.parseInt(hfin[0]);
                    }

                    strHfin = hf + ":" + hfin[1];
                    //turnoDetVO.setHfinal(res.getString("hora_final")+" "+ampm);
                    turnoDetVO.setHfinal(strHfin + " " + ampm);

                    turnoDetVO.setFecha(res.getDate("fecha"));

                    if (res.getString("nombre1") == null) {
                        turnoDetVO.setPaciente("");
                    } else {
                        turnoDetVO.setPaciente(res.getString("nombre1") + " " + res.getString("nombre2") + " " + res.getString("apellido1") + " " + res.getString("apellido2"));
                    }

                    if (res.getString("estado") != null) {
                        if (res.getString("estado").equals("F")) {
                            turnoDetVO.setEstado("ANULADA");
                        } else {
                            turnoDetVO.setEstado("VIGENTE");
                        }
                    }

                    listDetTurnoVO.add(turnoDetVO);
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        }

        return listDetTurnoVO;
    }

    
    @Override
    public List<TurnoDetVO> consultarDetalleTurnoLibre(int id_medico, String fecha_turno, int id_sede) throws SQLException, NamingException{
    ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        String condicion = "";

        List<TurnoDetVO> listDetTurnoVO = new ArrayList<TurnoDetVO>();

        String sql = " SELECT tb_turnomedico.fecha,"
                + "tb_detalleturno.hora_inicio,"
                + "tb_detalleturno.hora_final,"
                + "tb_detalleturno.id,"
                + "tb_turnomedico.tiempo,"
                + "tb_citamedica.estado,"
                + "tb_paciente.nombre1,"
                + "tb_paciente.nombre2,"
                + "tb_paciente.apellido1,"
                + "tb_paciente.apellido2 "
                + "FROM tb_detalleturno "
                + "INNER JOIN tb_turnomedico ON (tb_detalleturno.id_turnomedico = tb_turnomedico.id) "
                + "LEFT JOIN tb_citamedica   ON (tb_detalleturno.id = tb_citamedica.id_detalleturno) "
                + "LEFT JOIN tb_paciente     ON (tb_citamedica.id_paciente = tb_paciente.id)"
                + " WHERE "
                + " tb_turnomedico.id_medico = " +id_medico 
                + " AND tb_detalleturno.fecha_turno ='"+fecha_turno+"' "                
                + " AND tb_turnomedico.id_sede = " +id_sede 
                + " AND (tb_citamedica.estado IS NULL OR tb_citamedica.estado like'F') "
                + " AND tb_detalleturno.estado ='F' " 
                + " AND (reasignada ='F' OR reasignada is null)"
                + " AND (tb_detalleturno.fecha_turno+tb_detalleturno.hora_inicio) > CURRENT_TIMESTAMP";

        System.out.println("Sql BUSCAR detalle turnos: " + sql);

        PreparedStatement stmt = conn.prepareStatement(sql);
        try {
            ResultSet res = stmt.executeQuery();
            try {
                while (res.next()) {
                    TurnoDetVO turnoDetVO = new TurnoDetVO();
                    String ampm = "";
                    int hi = 0;
                    int hf = 0;
                    String strHini = "";
                    String strHfin = "";

                    turnoDetVO.setId(res.getInt("id"));
                    String[] hinicio = res.getString("hora_inicio").split(":");
                    if (Integer.parseInt(hinicio[0]) >= 12) {
                        ampm = "PM";
                        hi = Integer.parseInt(hinicio[0]) - 12;
                    } else {
                        ampm = "AM";
                        hi = Integer.parseInt(hinicio[0]);
                    }

                    strHini = hi + ":" + hinicio[1];
                    //turnoDetVO.setHinicio(res.getString("hora_inicio")+" "+ampm);
                    turnoDetVO.setHinicio(strHini + " " + ampm);


                    String[] hfin = res.getString("hora_final").split(":");
                    if (Integer.parseInt(hfin[0]) >= 12) {
                        ampm = "PM";
                        hf = Integer.parseInt(hfin[0]) - 12;
                    } else {
                        ampm = "AM";
                        hf = Integer.parseInt(hfin[0]);
                    }

                    strHfin = hf + ":" + hfin[1];
                    //turnoDetVO.setHfinal(res.getString("hora_final")+" "+ampm);
                    turnoDetVO.setHfinal(strHfin + " " + ampm);

                    turnoDetVO.setFecha(res.getDate("fecha"));

                    if (res.getString("nombre1") == null) {
                        turnoDetVO.setPaciente("EL PACIENTE SELECCIONADO");
                    } else {
                        turnoDetVO.setPaciente(res.getString("nombre1") + " " + res.getString("nombre2") + " " + res.getString("apellido1") + " " + res.getString("apellido2"));
                    }

                    if (res.getString("estado") != null) {
                        if (res.getString("estado").equals("F")) {
                            turnoDetVO.setEstado("LIBERADO");
                        } else {
                            turnoDetVO.setEstado("VIGENTE");
                        }
                    }

                    listDetTurnoVO.add(turnoDetVO);
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        }
        return listDetTurnoVO;
    }
    
    @Override
    public List<TurnoDetVO> consultarDetalleTurnoVigentePaciente(int id_medico, String fecha_turno, int id_sede, int id_paciente) throws SQLException, NamingException{
    ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        String condicion = "";

        List<TurnoDetVO> listDetTurnoVO = new ArrayList<TurnoDetVO>();

        String sql = " SELECT tb_turnomedico.fecha,"
                + "tb_detalleturno.hora_inicio,"
                + "tb_detalleturno.hora_final,"
                + "tb_detalleturno.id,"
                + "tb_turnomedico.tiempo,"
                + "tb_citamedica.estado,"
                + "tb_paciente.nombre1,"
                + "tb_paciente.nombre2,"
                + "tb_paciente.apellido1,"
                + "tb_paciente.apellido2 "
                + "FROM tb_detalleturno "
                + "INNER JOIN tb_turnomedico ON (tb_detalleturno.id_turnomedico = tb_turnomedico.id) "
                + "LEFT JOIN tb_citamedica   ON (tb_detalleturno.id = tb_citamedica.id_detalleturno) "
                + "LEFT JOIN tb_paciente     ON (tb_citamedica.id_paciente = tb_paciente.id)"
                + " WHERE "
                + " tb_turnomedico.id_medico = " +id_medico 
               // + " AND tb_detalleturno.fecha_turno ='"+fecha_turno+"' "                
                + " AND tb_turnomedico.id_sede = " +id_sede 
                + " AND tb_citamedica.id_paciente = " +id_paciente 
                + " AND tb_detalleturno.estado ='F' " 
                + " AND tb_citamedica.asistencia  LIKE 'F' "
                + " AND tb_citamedica.estado  LIKE 'T' ";
               // + " AND (tb_detalleturno.fecha_turno+tb_detalleturno.hora_inicio) > CURRENT_TIMESTAMP";

        System.out.println("Sql BUSCAR detalle turnos: " + sql);

        PreparedStatement stmt = conn.prepareStatement(sql);
        try {
            ResultSet res = stmt.executeQuery();
            try {
                while (res.next()) {
                    TurnoDetVO turnoDetVO = new TurnoDetVO();
                    String ampm = "";
                    int hi = 0;
                    int hf = 0;
                    String strHini = "";
                    String strHfin = "";

                    turnoDetVO.setId(res.getInt("id"));
                    String[] hinicio = res.getString("hora_inicio").split(":");
                    if (Integer.parseInt(hinicio[0]) >= 12) {
                        ampm = "PM";
                        hi = Integer.parseInt(hinicio[0]) - 12;
                    } else {
                        ampm = "AM";
                        hi = Integer.parseInt(hinicio[0]);
                    }

                    strHini = hi + ":" + hinicio[1];
                    //turnoDetVO.setHinicio(res.getString("hora_inicio")+" "+ampm);
                    turnoDetVO.setHinicio(strHini + " " + ampm);


                    String[] hfin = res.getString("hora_final").split(":");
                    if (Integer.parseInt(hfin[0]) >= 12) {
                        ampm = "PM";
                        hf = Integer.parseInt(hfin[0]) - 12;
                    } else {
                        ampm = "AM";
                        hf = Integer.parseInt(hfin[0]);
                    }

                    strHfin = hf + ":" + hfin[1];
                    //turnoDetVO.setHfinal(res.getString("hora_final")+" "+ampm);
                    turnoDetVO.setHfinal(strHfin + " " + ampm);

                    turnoDetVO.setFecha(res.getDate("fecha"));

                    if (res.getString("nombre1") == null) {
                        turnoDetVO.setPaciente("");
                    } else {
                        turnoDetVO.setPaciente(res.getString("nombre1") + " " + res.getString("nombre2") + " " + res.getString("apellido1") + " " + res.getString("apellido2"));
                    }


                    if (res.getString("estado") != null) {
                        if (res.getString("estado").equals("F")) {
                            turnoDetVO.setEstado("ANULADA");
                        } else {
                            turnoDetVO.setEstado("VIGENTE");
                        }
                    }

                    listDetTurnoVO.add(turnoDetVO);
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        }
        return listDetTurnoVO;
    }
    
    
    @Override
    public List<TurnoDetVO> consultarDetalleTurnoInasistente(int id_medico, String fecha_turno, int id_sede) throws SQLException, NamingException{
    ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();
        
      

        String condicion = "";

        List<TurnoDetVO> listDetTurnoVO = new ArrayList<TurnoDetVO>();

        String sql = " SELECT tb_turnomedico.fecha,"
                + "tb_detalleturno.hora_inicio,"
                + "tb_detalleturno.hora_final,"
                + "tb_detalleturno.id,"
                + "tb_turnomedico.tiempo,"
                + "tb_citamedica.estado,"
                + "tb_paciente.nombre1,"
                + "tb_paciente.nombre2,"
                + "tb_paciente.apellido1,"
                + "tb_paciente.apellido2 "
                + "FROM tb_detalleturno "
                + "INNER JOIN tb_turnomedico ON (tb_detalleturno.id_turnomedico = tb_turnomedico.id) "
                + "LEFT JOIN tb_citamedica   ON (tb_detalleturno.id = tb_citamedica.id_detalleturno) "
                + "LEFT JOIN tb_paciente     ON (tb_citamedica.id_paciente = tb_paciente.id)"
                + " WHERE "
                + " tb_turnomedico.id_medico = " +id_medico 
                + " AND tb_detalleturno.fecha_turno ='"+fecha_turno+"' "                
                + " AND tb_turnomedico.id_sede = " +id_sede   
                + " AND tb_detalleturno.estado ='F' " 
                + " AND tb_citamedica.estado  LIKE 'T' "
                + " AND tb_citamedica.asistencia  LIKE 'F' "
                + " AND (tb_detalleturno.fecha_turno+tb_detalleturno.hora_final) < CURRENT_TIMESTAMP";

        System.out.println("Sql BUSCAR detalle turnos: " + sql);

        PreparedStatement stmt = conn.prepareStatement(sql);
        try {
            ResultSet res = stmt.executeQuery();
            try {
                while (res.next()) {
                    TurnoDetVO turnoDetVO = new TurnoDetVO();
                    String ampm = "";
                    int hi = 0;
                    int hf = 0;
                    String strHini = "";
                    String strHfin = "";

                    turnoDetVO.setId(res.getInt("id"));
                    String[] hinicio = res.getString("hora_inicio").split(":");
                    if (Integer.parseInt(hinicio[0]) >= 12) {
                        ampm = "PM";
                        hi = Integer.parseInt(hinicio[0]) - 12;
                    } else {
                        ampm = "AM";
                        hi = Integer.parseInt(hinicio[0]);
                    }

                    strHini = hi + ":" + hinicio[1];
                    //turnoDetVO.setHinicio(res.getString("hora_inicio")+" "+ampm);
                    turnoDetVO.setHinicio(strHini + " " + ampm);


                    String[] hfin = res.getString("hora_final").split(":");
                    if (Integer.parseInt(hfin[0]) >= 12) {
                        ampm = "PM";
                        hf = Integer.parseInt(hfin[0]) - 12;
                    } else {
                        ampm = "AM";
                        hf = Integer.parseInt(hfin[0]);
                    }

                    strHfin = hf + ":" + hfin[1];
                    //turnoDetVO.setHfinal(res.getString("hora_final")+" "+ampm);
                    turnoDetVO.setHfinal(strHfin + " " + ampm);

                    turnoDetVO.setFecha(res.getDate("fecha"));

                    if (res.getString("nombre1") == null) {
                        turnoDetVO.setPaciente("");
                    } else {
                        turnoDetVO.setPaciente(res.getString("nombre1") + " " + res.getString("nombre2") + " " + res.getString("apellido1") + " " + res.getString("apellido2"));
                    }


                    if (res.getString("estado") != null) {
                        if (res.getString("estado").equals("F")) {
                            turnoDetVO.setEstado("ANULADA");
                        } else {
                            turnoDetVO.setEstado("EXPIRADO");
                        }
                    }

                    listDetTurnoVO.add(turnoDetVO);
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        }
        return listDetTurnoVO;
    }
    
    
    @Override
    public List<TurnoDetVO> consultarDetalleTurnoParaBloquear(int id_medico, String fecha_turno1, String fecha_turno2, int id_sede) throws SQLException, NamingException{
    ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        String condicion = "";

        List<TurnoDetVO> listDetTurnoVO = new ArrayList<TurnoDetVO>();
        
        System.out.println("mirando las fechas: "+fecha_turno1+" "+fecha_turno2);

        String sql = " SELECT tb_detalleturno.fecha_turno,"
                + "tb_detalleturno.hora_inicio,"
                + "tb_detalleturno.hora_final,"
                + "tb_detalleturno.id,"
                + "tb_turnomedico.tiempo,"
                + "tb_detalleturno.estado "
                + "FROM tb_detalleturno "
                + "INNER JOIN tb_turnomedico ON (tb_detalleturno.id_turnomedico = tb_turnomedico.id) "              
                + " WHERE "
                + " tb_turnomedico.id_medico = " +id_medico 
                + " AND tb_turnomedico.id_sede = " +id_sede              
                //+ " AND tb_detalleturno.estado  LIKE 'F' "
                + " AND (tb_detalleturno.fecha_turno+tb_detalleturno.hora_inicio) >='"+fecha_turno1+"' " 
                + " AND (tb_detalleturno.fecha_turno+tb_detalleturno.hora_final) <='"+fecha_turno2+"' "
                + " ORDER BY tb_detalleturno.fecha_turno,hora_inicio,hora_final ";

        System.out.println("Sql BUSCAR detalle turnos para bloquear: " + sql);

        PreparedStatement stmt = conn.prepareStatement(sql);
        try {
            ResultSet res = stmt.executeQuery();
            try {
                while (res.next()) {
                    TurnoDetVO turnoDetVO = new TurnoDetVO();
                    String ampm = "";
                    int hi = 0;
                    int hf = 0;
                    String strHini = "";
                    String strHfin = "";

                    turnoDetVO.setId(res.getInt("id"));
                    String[] hinicio = res.getString("hora_inicio").split(":");
                    if (Integer.parseInt(hinicio[0]) >= 12) {
                        ampm = "PM";
                        hi = Integer.parseInt(hinicio[0]) - 12;
                    } else {
                        ampm = "AM";
                        hi = Integer.parseInt(hinicio[0]);
                    }

                    strHini = res.getDate("fecha_turno").toString()+":"+   hi + ":" + hinicio[1];
                    //turnoDetVO.setHinicio(res.getString("hora_inicio")+" "+ampm);
                    turnoDetVO.setHinicio(strHini + " " + ampm);


                    String[] hfin = res.getString("hora_final").split(":");
                    if (Integer.parseInt(hfin[0]) >= 12) {
                        ampm = "PM";
                        hf = Integer.parseInt(hfin[0]) - 12;
                    } else {
                        ampm = "AM";
                        hf = Integer.parseInt(hfin[0]);
                    }

                    strHfin = res.getDate("fecha_turno").toString()+":"+  hf + ":" + hfin[1];
                    //turnoDetVO.setHfinal(res.getString("hora_final")+" "+ampm);
                    turnoDetVO.setHfinal(strHfin + " " + ampm);

                    turnoDetVO.setFecha(res.getDate("fecha_turno"));

                   /* if (res.getString("nombre1") == null) {
                        turnoDetVO.setPaciente("");
                    } else {
                        turnoDetVO.setPaciente(res.getString("nombre1") + " " + res.getString("nombre2") + " " + res.getString("apellido1") + " " + res.getString("apellido2"));
                    }*/


                    if (res.getString("estado") != null) {
                        String r = res.getString("estado");
                        
                        
                        if (res.getString("estado").equals("F")) 
                            turnoDetVO.setEstado("DISPONIBLE");
                        
                        if (res.getString("estado").equals("T")) 
                            turnoDetVO.setEstado("BLOQUEADO");
                        
                    }

                    listDetTurnoVO.add(turnoDetVO);
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        }
        return listDetTurnoVO;
    }
    
    
    
    @Override
    public int bloquearTurno(int id_medico, String fecha_turno1, String fecha_turno2, int id_sede) throws SQLException, NamingException{
    ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();
        
        String sql = " UPDATE tb_detalleturno SET estado='T' "
                + " WHERE "
                + " tb_detalleturno.estado LIKE 'F' "
                + " AND (tb_detalleturno.fecha_turno+tb_detalleturno.hora_inicio) >='"+fecha_turno1+"' " 
                + " AND (tb_detalleturno.fecha_turno+tb_detalleturno.hora_final) <='"+fecha_turno2+"' "
                + " AND tb_detalleturno.id_turnomedico IN (SELECT tb_turnomedico.id FROM tb_turnomedico "  
                + " WHERE  tb_turnomedico.id_medico = " +id_medico 
                + " AND tb_turnomedico.id_sede =" +id_sede+ ")";
       
                
        System.out.println("Sql bloquear actualiza detalle turnos: " + sql);

         PreparedStatement stmt = conn.prepareStatement(sql);
         int rd = stmt.executeUpdate();
        
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        return rd;
    }
    
    
    @Override
    public int  bloquearTurno(int id_detturno) throws SQLException, NamingException{
    ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        String sql = " UPDATE tb_detalleturno SET estado='T' "
                + " WHERE "
                + " tb_detalleturno.id = " +id_detturno 
                + " AND tb_detalleturno.estado  LIKE 'F' ";

        System.out.println("Sql bloquear actualiza detalle turnos: " + sql);

         PreparedStatement stmt = conn.prepareStatement(sql);
         int rd = stmt.executeUpdate();
        
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        
        return rd;
    }
    
    @Override
    public int  desBloquearTurno(int id_detturno) throws SQLException, NamingException{
    ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();
        String sql = " UPDATE tb_detalleturno SET estado='F' "
                + " WHERE "
                + " tb_detalleturno.id = " +id_detturno 
                + " AND tb_detalleturno.estado  LIKE 'T' ";
        System.out.println("Sql desbloqueao el turno: " + sql);
         PreparedStatement stmt = conn.prepareStatement(sql);
         int rd = stmt.executeUpdate();
        
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        
        return rd;
    }
    
    
    
    @Override
    public void asignarCita(int id_detturno, int id_medico, int id_paciente) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();
        reasignarCita(id_detturno, "T");
        String sqlAdiciona = "INSERT INTO tb_citamedica("
                + "id_detalleturno, id_paciente, estado, asistencia, id_usuario,facturado,fecha)"
                + "VALUES (?,?,'T','F',1,'F',current_timestamp)";

        PreparedStatement stmt = conn.prepareStatement(sqlAdiciona);
        stmt.setInt(1, id_detturno);
        stmt.setInt(2, id_paciente);
        stmt.execute();
        stmt.close();
        if (!conn.isClosed()) {
            conn.close();
        }

    }

    @Override
    public void anularCita(int id_detturno) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();


        reasignarCita(id_detturno, "F");


        String sql = "UPDATE tb_citamedica"
                + " SET estado='F'"
                + " WHERE tb_citamedica.id_detalleturno=?";
        System.out.println("SQL del Update medico=" + sql);

        PreparedStatement stmt = conn.prepareStatement(sql);

        stmt.setInt(1, id_detturno);
        stmt.execute();
        stmt.close();
        if (!conn.isClosed()) {
            conn.close();
        }
    }
    
    
    @Override
    public void marcarAsistenciaCita(int id_detturno) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        String sql = "UPDATE tb_citamedica"
                + " SET asistencia='T'"
                + " WHERE tb_citamedica.id_detalleturno=?";

        System.out.println("SQL del Update asistencia=" + sql);
        PreparedStatement stmt = conn.prepareStatement(sql);
        stmt.setInt(1, id_detturno);
        stmt.execute();
        stmt.close();
        if (!conn.isClosed()) {
            conn.close();
        }
    }

    
    

    public void reasignarCita(int id_detturno, String dato) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        String sql = "UPDATE tb_citamedica"
                + " SET reasignada='" + dato + "'"
                + " WHERE tb_citamedica.id_detalleturno=?";

        PreparedStatement stmt = conn.prepareStatement(sql);

        stmt.setInt(1, id_detturno);
        stmt.execute();
        stmt.close();
        if (!conn.isClosed()) {
            conn.close();
        }
    }

    @Override
    public CitaVO getDatosCita(int id) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        String sql = "SELECT "
                + "tb_detalleturno.id,"
                + "tb_paciente.numero_identificacion,"
                + "tb_paciente.nombre1 pn1,"
                + "tb_paciente.nombre2 pn2,"
                + "tb_paciente.apellido1 pa1,"
                + "tb_paciente.apellido2 pa2,"
                + "tb_detalleturno.hora_inicio,"
                + "tb_detalleturno.hora_final,"
                + "tb_medico.nombre1,"
                + "tb_medico.nombre2,"
                + "tb_medico.apellido1,"
                + "tb_medico.apellido2,"
                + "tb_especialidad.descripcion,"
                + "tb_turnomedico.fecha"
                + " FROM public.tb_detalleturno,"
                + " public.tb_citamedica,"
                + " public.tb_paciente,"
                + " public.tb_turnomedico,"
                + " public.tb_medico,"
                + " public.tb_medicoespecialidad,"
                + " public.tb_especialidad"
                + " WHERE "
                + "tb_detalleturno.id_turnomedico = tb_turnomedico.id AND"
                + " tb_citamedica.id_detalleturno = tb_detalleturno.id AND"
                + " tb_citamedica.id_paciente = tb_paciente.id AND"
                + " tb_turnomedico.id_medico = tb_medico.id AND"
                + " tb_medico.id = tb_medicoespecialidad.id_medico AND"
                + " tb_medicoespecialidad.id_especialidad = tb_especialidad.id AND"
                + " tb_detalleturno.estado ='F' AND " 
                + " tb_citamedica.estado = 'T' AND tb_detalleturno.id =" + id;

        System.out.println("Sql buscar cita datos ID: " + sql);

        PreparedStatement stmt = conn.prepareStatement(sql);
        CitaVO citaVO = new CitaVO();
        try {
            ResultSet res = stmt.executeQuery();
            try {

                if (res.next()) {
                    citaVO.setHora(res.getString("hora_inicio"));
                    citaVO.setFecha(res.getDate("fecha"));
                    citaVO.setMedico(res.getString("nombre1") + " " + res.getString("nombre2") + " " + res.getString("apellido1") + " " + res.getString("apellido2"));
                    citaVO.setEspecialidad(res.getString("descripcion"));
                    citaVO.setPaciente(res.getString("pn1") + " " + res.getString("pn2") + " " + res.getString("pa1") + " " + res.getString("pa2"));
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }

        }
        return citaVO;

    }

    @Override
    public List<TurnoVO> consultarTurno(int medico, int sede) throws NamingException, SQLException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        List<TurnoVO> listTurno = new ArrayList<TurnoVO>();

        String condicion = "";


        String sql = "SELECT "
                + "tb_turnomedico.id,"
                + "tb_turnomedico.fecha"
                + " FROM "
                + "public.tb_turnomedico,"
                + "public.tb_detalleturno "
                + "WHERE "
                + "tb_turnomedico.id = tb_detalleturno.id_turnomedico AND "
                + "tb_turnomedico.fecha >= CURRENT_DATE AND "
                + "tb_detalleturno.estado ='F' AND " 
                + "tb_turnomedico.id_medico = " + medico
                + " AND tb_turnomedico.id_sede = " + sede;


        System.out.println("Buscar Turnos: " + sql);


        PreparedStatement stmt = conn.prepareStatement(sql);

        try {
            ResultSet res = stmt.executeQuery();
            try {
                while (res.next()) {
                    TurnoVO turnoVo = new TurnoVO();
                    turnoVo.setFecha(res.getDate("fecha"));
                    turnoVo.setId(res.getInt("id"));
                    listTurno.add(turnoVo);
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        }
        return listTurno;
    }

    @Override
    public int turnosFecha(int medico, Date fecha) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();
        int count = 0;

        String sql = "SELECT COUNT(*) cant FROM "
                + "public.tb_detalleturno, "
                + "public.tb_turnomedico WHERE "
                + "tb_detalleturno.id_turnomedico = tb_turnomedico.id"
                + " AND tb_detalleturno.estado ='F' " 
                + "  AND tb_turnomedico.fecha = '" + fecha + "'  AND tb_turnomedico.id_medico=" + medico;

        PreparedStatement stmt = conn.prepareStatement(sql);

        try {
            ResultSet res = stmt.executeQuery();
            try {
                if (res.next()) {
                    count = res.getInt(1);
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        }


        return count;
    }

    @Override
    public int turnosAsignadosFecha(int medico, Date fecha) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();
        int count = 0;

        String sql = "SELECT COUNT(tb_turnomedico.id)"              
                + "FROM public.tb_detalleturno, "               
                + "public.tb_turnomedico, "
                + "public.tb_citamedica "
                + "WHERE "
                + "tb_citamedica.id_detalleturno = tb_detalleturno.id "
                + "AND tb_citamedica.estado <>'F' "
                + " AND tb_detalleturno.estado ='F' " 
                + "AND tb_detalleturno.id_turnomedico = tb_turnomedico.id "               
                + "AND tb_turnomedico.fecha='" + fecha + "'  AND tb_turnomedico.id_medico=" + medico + " ";
               


        System.out.println("Asignados fecha: " + sql);

        PreparedStatement stmt = conn.prepareStatement(sql);

        try {
            ResultSet res = stmt.executeQuery();
            try {
                if (res.next()) {
                    count = res.getInt(1);
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        }


        return count;
    }

    @Override
    public List<TurnoVO> consultarTurnosOk(int medico, int sede) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        List<TurnoVO> listTurno = new ArrayList<TurnoVO>();

        String condicion = "";


        String sql = "SELECT DISTINCT tb_turnomedico.fecha "
                + " FROM "
                + "public.tb_turnomedico,"
                + "public.tb_detalleturno "
                + "WHERE "
                + "tb_turnomedico.id = tb_detalleturno.id_turnomedico AND "
                + " tb_turnomedico.fecha >= CURRENT_DATE AND "
                + " tb_detalleturno.estado='F' AND " 
                + " tb_turnomedico.id_medico = " + medico
                + " AND tb_turnomedico.id_sede = " + sede;


        System.out.println("Buscar SOLO Turnos: " + sql);


        PreparedStatement stmt = conn.prepareStatement(sql);

        try {
            ResultSet res = stmt.executeQuery();
            try {
                while (res.next()) {
                    TurnoVO turnoVo = new TurnoVO();
                    turnoVo.setFecha(res.getDate("fecha"));
                    listTurno.add(turnoVo);
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        }
        return listTurno;
    }

    @Override
    public void actualizarEstadoCita(int idCita) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();
        String sql = "UPDATE tb_citamedica"
                + " SET facturado='T'"
                + " WHERE tb_citamedica.id=?";

        PreparedStatement stmt = conn.prepareStatement(sql);

        stmt.setInt(1, idCita);
        stmt.execute();
        stmt.close();
        if (!conn.isClosed()) {
            conn.close();
        }
    }
}